package code12._class;

import org.junit.Test;

import code12._class.Outer1;

public class TestMemberClass {
	@Test
	public void f1() {
		Outer1 o1 = new Outer1();
		// 在外部类的外部 访问内部类
		System.out.println("Inner.sex:"+Outer1.Inner.sex);
		// 创建成员内部类对象 语法: 外部类.内部类 内部类对象名 = 外部类对象名.new 内部类();
		Outer1.Inner n1 = o1.new Inner();
		System.out.println("n1.age:"+n1.age);
		//System.out.println("n1.id:"+n1.id);
		n1.print();
	}
}

class Outer1 {// 外部类
	private String name = "tom";
	int age = 20;
	static String addr = "南京";
	
	public void show(){
		System.out.println("Outer1.show()");
		// 在外部类中访问内部类
		Inner n1 = new Inner();
		System.out.println("n1.age:"+n1.age);
		System.out.println("n1.id:"+n1.id);// 可以访问 内部类的 私有
		n1.print();
		System.out.println("Inner.sex:"+Inner.sex);
	}
	
	class Inner {// 成员(非静态)内部类
		int age = 22;
		private String id = "No1";
		// 不能定义静态的属性和方法
		//static String sex = "男";
		// 如果需要定义静态属性，需要使用 final修饰
		static final String sex = "男";
		
		public void print(){
			System.out.println("Outer1.Inner.print()");
			// 调用自己
			System.out.println("id:"+this.id);// 可以省略this
			System.out.println("age:"+age);// 优先访问自己的
			// 调用 外部的 name (不同名)
			System.out.println("name:"+name);// 直接访问, 可以访问外部类的私有
			
			// 通过 外部类名.this 获取当前外部类的对象 (属性名/方法名相同)
			System.out.println("age:"+Outer1.this.age);
		}
	}
	
}